// ==UserScript==
// @name 宝可梦点击(Poke Clicker)辅助脚本 自动孵蛋模块
// @namespace PokeClickerHelper
// @version 0.1.2
// @description 全自动高效孵化宝可梦、宝可梦蛋、化石
// @author DreamNya
// @match https://www.pokeclicker.com
// @match https://g8hh.github.io/pokeclicker/
// @match https://pokeclicker.g8hh.com
// @match https://yx.g8hh.com/pokeclicker/
// @icon data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/319hf99fYX/fX2F/319hf8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////99fYX/fX2F/319hf8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////wAAAP8AAAD/fX2F/319hf99fYX/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8AAAD/AAAA/wAAAP99fYX/fX2F/wAAAP8AAAD/AAAA/319hf8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/HBT//xwU//8AAAD//////319hf8AAAD/Dgim/w4Ipv8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAD/HBT//xwU//8cFP//HBT//wAAAP8AAAD/Dgim/w4Ipv8OCKb/Dgim/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA/xwU//8cFP//HBT//xwU/44cFP//HBT//xwU//8cFP//Dgim/w4Ipv8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/HBT//xwU/47/////HBT/jhwU//8cFP//HBT//w4Ipv8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/xwU//8cFP//HBT/jhwU//8OCKb/Dgim/w4Ipv8OCKb/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/xwU//8OCKb/Dgim/w4Ipv8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAPw/AADwDwAA4AcAAOAHAADAAwAAwAMAAMADAADAAwAA4AcAAOAHAADwDwAA/D8AAP//AAD//wAA//8AAA==
// @grant none
// @license MIT
// @run-at document-end
// ==/UserScript==
/* global App, $, PokeClickerHelper, Underground, PartyController, GameConstants, player, ItemList, CaughtStatus, PokemonHelper */
//TODO:加入宝可梦属性检测、自定义优先级
if (typeof PokeClickerHelper == typeof void 0) {
alert('宝可梦点击(Poke Clicker)辅助脚本 自动孵蛋模块加载失败\n\n未找到核心模块,需要先安装核心模块才可正常使用\n\n论坛主页:https://bbs.tampermonkey.net.cn/forum.php?mod=viewthread&tid=3842')
window.open("https://bbs.tampermonkey.net.cn/forum.php?mod=viewthread&tid=3842")
return
}
//UI相关
PokeClickerHelper.UIDOM.push(`
`)
const fuc = () => {
//非挑战模式区域减益隐藏
if (!App.game.challenges.list.regionalAttackDebuff.active()) $('#PokeClickerHelperBreedingRegionDebuffDiv').addClass('invisible')
}
//监听不要写在UICustomFuc中,避免读取DOM设置存储时多余触发监听事件
const listener = () => {
$('#PokeClickerHelperToggleBreeding').on('click', function () {
if (this.value == '结束') {
PokeClickerHelper.restoreHook(PokeClickerHelper.hookGame.breeding) //还原hook方法
$('#PokeClickerHelperToggleBreeding').text(this.value = '开始')
} else {
PokeClickerHelper.applyHook(PokeClickerHelper.hookGame.breeding) //应用hook方法
$('#PokeClickerHelperToggleBreeding').text(this.value = '结束')
}
})
$("#PokeClickerHelperBreedingType").on('change', function () {
const isPokemon = this.value == 'BreadingPokemon'
$("label:has(#PokeClickerHelperBreedingInvert)").toggleClass('invisible', !isPokemon)
$("label:has(#PokeClickerHelperBreedingUncaught)").toggleClass('invisible', isPokemon)
$("#PokeClickerHelperBreedingType").parent().siblings().toggleClass('opacity-25', !isPokemon)
})
}
PokeClickerHelper.UICustomFuc.push(fuc);
PokeClickerHelper.UIlistener.push(listener);
//暴露对象方法到全局
const BreedingHelper = {};
PokeClickerHelper.BreedingHelper = BreedingHelper;
//满步数自动孵蛋、有空位自动孵蛋 hook方法
const autoHatch = function (Game) {
const replacement = [['this._queueList().length && ', ''],
[/^/, "PokeClickerHelper.BreedingHelper.AutoBreeding();"]];
PokeClickerHelper.HookFuc(Game.breeding, 'progressEggs', replacement, 'amount');
PokeClickerHelper.restoreHook(PokeClickerHelper.hookGame.breeding)
}
PokeClickerHelper.addHook('Game', autoHatch)
/*
孵完蛋后自动孵蛋【废弃 改为只hook autoHatch】
const autoBreed = function (Game) {
const replacement = [[/}\n $/, 'PokeClickerHelper.BreedingHelper.AutoBreeding()}']];
PokeClickerHelper.HookFuc(Game.breeding, 'hatchPokemonEgg', replacement, 'index');
//PokeClickerHelper.BreedingHelper.AutoBreeding()
}
PokeClickerHelper.addHook('Game', autoBreed)
*/
//委托函数 利用语法糖配合解构减少冗余代码
BreedingHelper.AutoBreeding = () => {
if (!App.game.breeding.hasFreeEggSlot()) return
let value = [...document.querySelectorAll('#PokeClickerHelperBreeding select')].map(i => i.value)
if (value.length > 0) BreedingHelper[value.shift()](value)
}
//tick方法孵蛋【废弃 改为hook方法调用孵蛋代码】
//PokeClickerHelper.hookGameTickList.add(BreedingHelper.AutoBreeding)
//利用解构减少代码
//孵宝可梦
BreedingHelper.BreadingPokemon = ([sortOption, shiny, region]) => {
let direction = document.querySelector("#PokeClickerHelperBreedingInvert").value == 'false'
let pokemonArr = App.game.party.caughtPokemon
if (shiny != 'all') {
shiny = JSON.parse(shiny)
pokemonArr = pokemonArr.filter(pokemon => pokemon.shiny == shiny)
}
pokemonArr = pokemonArr.sort(PartyController.compareBy(sortOption * 1, direction, region * 1))
for (let pokemon of pokemonArr) {
if (!App.game.breeding.hasFreeEggSlot()) break
if (pokemon.level >= 100 && !pokemon.breeding) App.game.breeding.addPokemonToHatchery(pokemon);
}
}
//孵蛋
BreedingHelper.BreadingEgg = () => {
let avaiableEgg = Object.keys(GameConstants.EggItemType).filter(e => isNaN(e)).filter(x => player._itemList[x]());
let onlyUncaught = document.querySelector("#PokeClickerHelperBreedingUncaught").value == 'true'
if (onlyUncaught) avaiableEgg = avaiableEgg.filter(i => ItemList[i].getCaughtStatus() == CaughtStatus.NotCaught)
avaiableEgg = avaiableEgg.map(i => Array(player._itemList[i]()).fill(i)).flat()
for (let egg of avaiableEgg) {
if (!App.game.breeding.hasFreeEggSlot()) break
ItemList[egg].use();
}
}
//孵化石
BreedingHelper.BreadingFossil = () => {
let avaiableFossil = Object.keys(GameConstants.FossilToPokemon).map(f => player.mineInventory().find(i => i.name == f)).filter(f => f ? f.amount() : false)
let onlyUncaught = document.querySelector("#PokeClickerHelperBreedingUncaught").value == 'true'
avaiableFossil = avaiableFossil.filter(i => {
let flag = PokemonHelper.calcNativeRegion(GameConstants.FossilToPokemon[i.name]) <= player.highestRegion()
if (onlyUncaught) flag = flag && PartyController.getCaughtStatusByName(GameConstants.FossilToPokemon[i.name]) == CaughtStatus.NotCaught
return flag
})
avaiableFossil = avaiableFossil.map(i => Array(i.amount()).fill(i.id)).flat()
for (let fossil of avaiableFossil) {
if (!App.game.breeding.hasFreeEggSlot()) break
Underground.sellMineItem(fossil)
}
}